﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../global/head.h"
#include "../macro/head.h"
#include "id_generator.h"

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos_common
{
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static id_generator::POOL * pool_ptr = 0;

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//

	id_generator::id_generator() : start( 2 )
	{
	}

	id_generator::~id_generator()
	{
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 
	// 
	// 

	int id_generator::remove( int mid )
	{
		int nRet = 0;

        ID_LIST input;
        ID_LIST tmp;
		{
			id * p = id::get_item_from_pool( true );
			p->init();
			p->_pos_xos_stl_set_opt = mid;
			p->_len_xos_stl_set_opt = 1;
			input.push_back( p );
		}
		id_set.subtract_set( tmp, ids, input );
		ids.swap( tmp );
		input.put_back_to_pool( true );
		tmp.put_back_to_pool( true );

		return nRet;
	}

	int id_generator::add( int mid )
	{
		int nRet = 0;

        ID_LIST input;
        ID_LIST tmp;
		{
			id * p = id::get_item_from_pool( true );
			p->init();
			p->_pos_xos_stl_set_opt = mid;
			p->_len_xos_stl_set_opt = 1;
			input.push_back( p );
		}
		id_set.merge_set( tmp, ids, input );
		ids.swap( tmp );
		input.put_back_to_pool( true );
		tmp.put_back_to_pool( true );

		return nRet;
	}

	// 
	// 从2开始生成id
	// 
	int id_generator::gen( int * lpnId )
	{
		int ret = 0;

		ID_ITER iter = ids.begin();
		int gen_id = start;
		bool bGet = false;

		if( !bGet && ( iter == ids.end() ) )
		{
			bGet = true;
		}
		
		while( !bGet && ( iter != ids.end() ) )
		{
			id * p = *iter;
			if( gen_id >= p->_pos_xos_stl_set_opt )
			{
				gen_id = p->_pos_xos_stl_set_opt + p->_len_xos_stl_set_opt;
				++iter;
			}
			else
			{
				bGet = true;
			}
		}

		add( gen_id );
		*lpnId = gen_id;
		
		return ret;
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 

    int id_generator::get_addr( POOL *** pppPool, LIST *** pppList )
    {
		int ret = 0;
		if( pppPool )
		{
			*pppPool = &pool_ptr;
		}
		if( pppList )
		{
			*pppList = 0;
		}
		return ret;
    }

	int id_generator::init()
	{
		int nRet = 0;
		return nRet;
	}

	int id_generator::term()
	{
		int nRet = 0;
		ids.put_back_to_pool( true );
		return nRet;
	}

}
